約 4,081,320 件
https://w.atwiki.jp/yosilove/pages/23.html
ドップラー効果(Doppler Effect)-CPP ALUT CPP Mac OpenAL ソースコード 解説 最終更新日 2009-09-26 link_pdfプラグインはご利用いただけなくなりました。 ダウンロード View - OpenALでドップラー効果を再現するサンプル。 ALUTが必要です。 ドップラー効果(Doppler Effect)-CPP main.cpp keyboard.cpp keyboad.h MakefileMac 実行方法 実行結果 メモ テスト環境 Tanks main.cpp #include math.h #include stdlib.h #include stdio.h #include OpenAL/al.h #include OpenAL/alc.h #include AL/alut.h #include "keyboard.h" ALuint Buffer;// Buffers hold sound data. ALuint Source;// Sources are points of emitting sound. /* 設定 */ //-- 音源(Source)の設定 ALfloat pitch = 1.0f; ALfloat gain = 1.0f; ALfloat SourcePos[] = { 0.0f, 0.0f, -50.0f };// Position of the source sound. ALfloat SourceVel[] = { 0.0f, 0.0f, 40.0f };// Velocity of the source sound. //単純にPosition += Velocityとすると時間が早すぎるので適当に補正値を掛けてみたり //Position += revise*Velocity const float revise = 0.000003; //-- 観測者(Listener)の設定 ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };// Position of the listener. ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };// Velocity of the listener. // Orientation of the listener. (first 3 elements are "at", second 3 are "up") ALfloat ListenerOri[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 }; //-- その他の設定 ALfloat SourceMaxDist = 80.0;//これ以上離れると初期位置に戻る //-- ドップラー効果の設定 //shift = DOPPLER_FACTOR * freq * (DOPPLER_VELOCITY - listener.velocity) / (DOPPLER_VELOCITY + source.velocity) #define DOPPLER_FACTOR 0.5f #define DOPPLER_VELOCITY 10.0f /* * ALboolean LoadALData() *wavデータの読み込みと音源の初期設定 */ ALboolean LoadALData() { ALenum format; ALsizei size; ALvoid* data; ALsizei freq; ALboolean loop; // Load wav data into a buffer. alGenBuffers(1, Buffer); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //wavファイルの読み込み alutLoadWAVFile((ALbyte*)"wavdata/Ambulance.wav", format, data, size, freq); alBufferData(Buffer, format, data, size, freq); alutUnloadWAV(format, data, size, freq); // Bind the buffer with the source. alGenSources(1, Source); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //ソースの初期設定 alSourcei (Source, AL_BUFFER, Buffer );//音源 alSourcef (Source, AL_PITCH, pitch );//ピッチ alSourcef (Source, AL_GAIN, gain );//ゲイン alSourcefv(Source, AL_POSITION, SourcePos);//座標 alSourcefv(Source, AL_VELOCITY, SourceVel);//移動 alSourcei (Source, AL_LOOPING, AL_TRUE );//繰り返す // Do an error check and return. if(alGetError() != AL_NO_ERROR) return AL_FALSE; return AL_TRUE; } /* * void SetListenerValues() * 観測者の設定 */ void SetListenerValues() { alListenerfv(AL_POSITION, ListenerPos); alListenerfv(AL_VELOCITY, ListenerVel); alListenerfv(AL_ORIENTATION, ListenerOri); } /* * void KillALData() * お掃除 */ void KillALData() { alDeleteBuffers(1, Buffer); alDeleteSources(1, Source); alutExit(); } int main(int argc, char *argv[]) { int i;//カウンタ ALboolean far=AL_FALSE;//遠いかどうかのフラグ printf("Doppler Effect\n"); printf("(Press any key to quit.)\n"); // 初期化 alutInit(NULL,0); alGetError(); // ソースの設定 if(LoadALData() == AL_FALSE) { printf("Error loading data."); return 0; } //観測者の設定 SetListenerValues(); // お掃除関数の指定 atexit(KillALData); // 再生開始 alSourcePlay(Source); //初期値を保存 ALfloat SourceDefPos[] = { SourcePos[0], SourcePos[1], SourcePos[2] }; //ドップラー効果の設定 alDopplerFactor(DOPPLER_FACTOR); alDopplerVelocity(DOPPLER_VELOCITY); while(!kbhit()){ far=AL_FALSE; for(i=0;i 3;i++){ //座標を更新 SourcePos[i] += revise*SourceVel[i]; //遠い? if( sqrt(abs(pow(SourcePos[i],2)+pow(ListenerPos[i],2)) ) SourceMaxDist) far = AL_TRUE; } //遠かったらはじめの位置に戻る if(far) for(i=0;i 3;i++) SourcePos[i]=SourceDefPos[i]; alSourcefv(Source, AL_POSITION, SourcePos); } return 0; } keyboard.cpp /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include "keyboard.h" void init_keyboard() { tcgetattr(0, initial_settings); new_settings = initial_settings; new_settings.c_lflag = ~ICANON; new_settings.c_lflag = ~ECHO; new_settings.c_lflag = ~ISIG; new_settings.c_cc[VMIN] = 1; new_settings.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, new_settings); } void close_keyboard() { tcsetattr(0, TCSANOW, initial_settings); } int kbhit() { char ch; int nread; if(peek_character != -1) return 1; new_settings.c_cc[VMIN]=0; tcsetattr(0, TCSANOW, new_settings); nread = read(0, ch,1); new_settings.c_cc[VMIN]=1; tcsetattr(0, TCSANOW, new_settings); if(nread == 1) { peek_character = ch; return 1; } return 0; } int readch() { char ch; if(peek_character != -1) { ch = peek_character; peek_character = -1; return ch; } read(0, ch,1); return ch; } keyboad.h /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include stdio.h #include termios.h #include term.h #include curses.h #include unistd.h static struct termios initial_settings, new_settings; static int peek_character = -1; void init_keyboard(); void close_keyboard(); int kbhit(); int readch(); Makefile Mac CC = g++ TARGET = doppler COMPILEFLAGS = -framework OpenAL -lalut $(TARGET) main.o keyboard.o $(CC) -o $(TARGET) main.o keyboard.o $(COMPILEFLAGS) main.o main.cpp $(CC) -c main.cpp -Wno-deprecated keyboard.o keyboard.h keyboard.cpp $(CC) -c keyboard.cpp -Wno-deprecated clean rm -f $(TARGET) main.o 実行方法 コンパイルして make 実行 ./doppler 実行結果 Doppler.mp3 メモ makeすると以下のようなメッセージが出たりするかもしれません。 main.cpp 57 warning ‘alutUnloadWAV’ is deprecated (declared at /usr/local/include/AL/alut.h 116) これは「alutLoadWAVFile」は今後のバージョンアップで使えなくなるかもよというメッセージです。 ALUTがバージョンアップすると、この関数は別の関数で置き換える必要がでるかも知れないので注意! テスト環境 MacOSX 10.5.8 i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 OpenAL ALUT 1.1.0 Tanks ドップラー効果 OpenAL Lesson 7 The Doppler Effec WEB WAVE LIB このプログラムに同梱されているwavファイルを頂きました。wavファイル「Ambulance.wav」を他のプログラムに利用する際には、必ずWEB WAVE LIBさんの規約に従ってください。
https://w.atwiki.jp/nina_a/pages/40.html
画像の合成 このページを編集 画像を他の画像の(x,y)を左上とする位置に合成する関数 void combine(IplImage* img, IplImage* add, const int x, const int y){ const int i_max( ((x+add- width ) img- width ) ? img- width - x add- width ); const int j_max( ((y+add- height) img- height) ? img- height - y add- height ); for(int j = 0; j j_max; ++j){ for(int i = 0; i i_max; ++i){ // imgの(x+i,y+j)をadd(i,j)で上書き copyat(img, x+i, y+j, add, i, j); } } return; } カテゴリ:OpenCV
https://w.atwiki.jp/yosilove/pages/20.html
音源の移動-CPP ALUT CPP Mac OpenAL ソースコード 解説 最終更新日 2009-09-25 View - link_pdfプラグインはご利用いただけなくなりました。 ダウンロード View - OpenALで音源が移動してゆくサンプル。 ALUTが必要です。 ドップラー効果(Doppler Effect)-CPP main.cpp keyboard.cpp keyboad.h MakefileMac 実行方法 実行結果 メモ テスト環境 Tanks main.cpp #include time.h #include stdlib.h #include stdio.h #include OpenAL/al.h #include OpenAL/alc.h #include AL/alut.h #include "keyboard.h" // Buffers hold sound data. ALuint Buffer; // Sources are points of emitting sound. ALuint Source; // Position of the source sound. ALfloat SourcePos[] = { 0.0f, 0.0f, 0.0f }; // Velocity of the source sound. ALfloat SourceVel[] = { 0.0f, 0.0f, 0.5f }; // Position of the listener. ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 }; // Velocity of the listener. ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 }; // Orientation of the listener. (first 3 elements are "at", second 3 are "up") ALfloat ListenerOri[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 }; /* * ALboolean LoadALData() * *This function will load our sample data from the disk using the alut *utility and send the data into OpenAL as a buffer. A source is then *also created to play that buffer. */ ALboolean LoadALData() { // Variables to load into. ALenum format; ALsizei size; ALvoid* data; ALsizei freq; ALboolean loop; // Load wav data into a buffer. alGenBuffers(1, Buffer); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //wavファイルの読み込み alutLoadWAVFile((ALbyte*)"wavdata/Footsteps.wav", format, data, size, freq); alBufferData(Buffer, format, data, size, freq); alutUnloadWAV(format, data, size, freq); // Bind the buffer with the source. alGenSources(1, Source); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //ソースの初期設定 alSourcei (Source, AL_BUFFER, Buffer );//音源 alSourcef (Source, AL_PITCH, 1.0f );//ピッチ alSourcef (Source, AL_GAIN, 1.0f );//ゲイン alSourcefv(Source, AL_POSITION, SourcePos);//座標 alSourcefv(Source, AL_VELOCITY, SourceVel);//移動 alSourcei (Source, AL_LOOPING, AL_TRUE );//繰り返す // Do an error check and return. if(alGetError() != AL_NO_ERROR) return AL_FALSE; return AL_TRUE; } /* * void SetListenerValues() * *We already defined certain values for the listener, but we need *to tell OpenAL to use that data. This function does just that. * リスナーの設定 */ void SetListenerValues() { alListenerfv(AL_POSITION, ListenerPos); alListenerfv(AL_VELOCITY, ListenerVel); alListenerfv(AL_ORIENTATION, ListenerOri); } /* * void KillALData() * *We have allocated memory for our buffers and sources which needs *to be returned to the system. This function frees that memory. * お掃除 */ void KillALData() { alDeleteBuffers(1, Buffer); alDeleteSources(1, Source); alutExit(); } int main(int argc, char *argv[]) { printf("MindCode s OpenAL Lesson 2 Looping and Fadeaway\n\n"); printf("Footsteps will slowly start to fade into the distance.\n"); printf("(Press any key to quit.)\n"); // Initialize OpenAL and clear the error bit. alutInit(NULL,0); alGetError(); // ソースの設定 if(LoadALData() == AL_FALSE) { printf("Error loading data."); return 0; } //リスなの設定 SetListenerValues(); // Setup an exit procedure. atexit(KillALData); // Begin the source playing. alSourcePlay(Source); // Loop ALint time = 0;//経過時間 ALint elapse = 0;//カウンタ while(!kbhit()) { elapse += (clock()/CLOCKS_PER_SEC) - time; time += elapse; if(elapse 1)//2秒に一回実行 { elapse = 0; //座標を更新 SourcePos[0] += SourceVel[0]; SourcePos[1] += SourceVel[1]; SourcePos[2] += SourceVel[2]; printf("Source (%f,%f,%f) \n",SourcePos[0],SourcePos[1],SourcePos[2]); alSourcefv(Source, AL_POSITION, SourcePos); } } return 0; } keyboard.cpp /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include "keyboard.h" void init_keyboard() { tcgetattr(0, initial_settings); new_settings = initial_settings; new_settings.c_lflag = ~ICANON; new_settings.c_lflag = ~ECHO; new_settings.c_lflag = ~ISIG; new_settings.c_cc[VMIN] = 1; new_settings.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, new_settings); } void close_keyboard() { tcsetattr(0, TCSANOW, initial_settings); } int kbhit() { char ch; int nread; if(peek_character != -1) return 1; new_settings.c_cc[VMIN]=0; tcsetattr(0, TCSANOW, new_settings); nread = read(0, ch,1); new_settings.c_cc[VMIN]=1; tcsetattr(0, TCSANOW, new_settings); if(nread == 1) { peek_character = ch; return 1; } return 0; } int readch() { char ch; if(peek_character != -1) { ch = peek_character; peek_character = -1; return ch; } read(0, ch,1); return ch; } keyboad.h /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include stdio.h #include termios.h #include term.h #include curses.h #include unistd.h static struct termios initial_settings, new_settings; static int peek_character = -1; void init_keyboard(); void close_keyboard(); int kbhit(); int readch(); Makefile Mac CC = g++ TARGET = lesson2 COMPILEFLAGS = -framework OpenAL -lalut $(TARGET) main.o keyboard.o $(CC) -o $(TARGET) main.o keyboard.o $(COMPILEFLAGS) main.o main.cpp $(CC) -c main.cpp -Wno-deprecated keyboard.o keyboard.h keyboard.cpp $(CC) -c keyboard.cpp -Wno-deprecated clean rm -f $(TARGET) main.o 実行方法 コンパイルして make 実行 ./lesson2 実行結果 Move.mp3 音量が小さいので注意。 メモ 「座標は表示されるのに音が鳴らない」という人 →音源の位置が遠すぎて音が聞こえない場合があります →main.cppの「if(elapse 1)」の部分や「ALfloat SourceVel[] = { 0.0f, 0.0f, 0.5f };」の部分を編集してみましょう。 makeすると以下のようなメッセージが出たりするかもしれません。 g++ -c main.cpp -Wno-deprecated main.cpp In function ‘ALboolean LoadALData()’ main.cpp 54 warning ‘alutLoadWAVFile’ is deprecated (declared at /usr/local/include/AL/alut.h 110) main.cpp 54 warning ‘alutLoadWAVFile’ is deprecated (declared at /usr/local/include/AL/alut.h 110) main.cpp 56 warning ‘alutUnloadWAV’ is deprecated (declared at /usr/local/include/AL/alut.h 116) main.cpp 56 warning ‘alutUnloadWAV’ is deprecated (declared at /usr/local/include/AL/alut.h 116) g++ -o lesson2 main.o keyboard.o -framework OpenAL -lalut これは「alutLoadWAVFile」と「alutUnloadWAV」は今後のバージョンアップで使えなくなるかもよというメッセージです。 ALUTがバージョンアップすると、この二つの関数は別の関数で置き換える必要がでるかも知れないので注意! テスト環境 MacOSX 10.5.8 i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 OpenAL ALUT 1.1.0 Tanks OpenAL Lesson 2 Looping and Fadeaway
https://w.atwiki.jp/takenote/pages/16.html
09/12/10 編集 mac上での使用感を
https://w.atwiki.jp/kojin/pages/26.html
CvvImage (別名 CImage) cvFindChessboardCorners
https://w.atwiki.jp/annomod/pages/75.html
右上でキャラクターが話す言葉や説明文などが載っています。 非常に量が多いですね^^; CPP(1) CPP(2) CPP(3) CPP(4) CPP(5) CPP(6) CPP(7) CPP(8) CPP(9) CPP(10) CPP(11) CPP(12) CPP(13) CPP(14) CPP(15) CPP(16) CPP(17) CPP(18) CPP(19) CPP(20) CPP(21) CPP(22) CPP(23) CPP(24) CPP(25) CPP(26) CPP(27)
https://w.atwiki.jp/phktech_tips/pages/24.html
会社のIさんにそそのかされたので,久しぶりにOpenCVをいじる カメラの画像を取り込んでウインドウに写す www34.atwiki.jp/phktech_tips VisualStudioプロジェクト CVCam_CaptureCam 画像ファイルを取り込んでウインドウに表示する
https://w.atwiki.jp/estyle/pages/7.html
C++に関する話題を自分用にメモ。 コーディング基準(整理後、別ページにする予定。) 基本ルール クラス名/メソッド名/関数名/変数名は略さない。(適切な名称で。) インデントはスペース4文字。(タブは使用しない。) Javaスタイル ファイル名は、「.cpp/.h」とする。 基本的に1クラス=1ファイルとする。 main関数は1ファイルとし、ファイル名の末尾はMain.cppとする。 変数の宣言は1行1変数とする。カンマで区切って複数宣言しない。 演算子やカンマ、イコールの前後は空白を入れる。 int value = 1 + 2; コメントは基本的に上に記述。 // OK int value = 1 + 2; 行の末尾に付与するコメントは禁止。 int value = 1 + 2; // NG クラスやメソッドのコメントはdoxygen形式で。 /** * 関数の説明 * @param a 引数A * @param b 引数B * @return 戻り値 */ int execute(int a, int b) { // ... } /* */形式のコメントは、ファイル先頭のコピーライト程度に使用するのみで、 基本的に使用しない。 処理をコメントアウトする場合には、行頭に//を加える。 // int execute(int a, int b) { // // ... // } 関数でも { の位置は行末で。 int execute(int a, int b) { // ... } if,for,whileでは1行の処理でも必ず{}を付ける。 if文 // if/else全体についてのコメント if (condition1) { // condition1で実行する処理についてのコメント 処理 } else if (condition2) ( // condition2で実行する処理についてのコメント 処理 } else { // elseで実行する処理についてのコメント 処理 } for文 for (int i = 0; i size; i++) { // ... } while文 while (boolValue) { // ... } switch文 case ... で必ず改行する。 // switch文全体に関するコメント switch (value) { case CASE_A // CASE_Aで処理する内容のコメント break; case CASE_B // CASE_Bで処理する内容のコメント break; case CASE_C // breakしない場合、「FALLTHROUGH」の記述は必須。 // FALLTHROUGH case CASE_D // CASE_C, CASE_Dで処理する内容のコメント break; default break; } class Foo { private // メンバ変数は先頭に「m_」を付与する。 int m_value; protected // ... public // ... }; グローバル変数には先頭に「g_」を付与する。 (ただしグローバル変数は基本的に使用しないこと。) ポインタには末尾に「_p」を付与する。 (ただし文字列(char*)なんかは、_pをつけなくてもよい。) 例外は、std exceptionを継承したクラスを作成する。 末尾はExceptionとする。 try { } catch (XxxException eXxx) { } using句は、クラス単位で。「using namespace xxx;」とはしない。 using std cout; using std endl; ヘッダファイル形式 #ifndef NAMESPACE_CLASS_NAME_H #define NAMESPACE_CLASS_NAME_H #endif long型は使用しない。int64_tやint32_tを使用する。 (boost/cstdint.hpp) わかりやすいコードを作成するための6つの方法 http //www-06.ibm.com/jp/developerworks/linux/library/l-clear-code/index.shtml オブジェクト倶楽部コーディング規約の会 http //www.objectclub.jp/community/codingstandard/ g++の場合「-Wall」は必須。 valgrind autotools STL,boost,Log4cxx,ICU,ACE,CppUnitについて。 Log4cxx 現在の安定バージョンである0.9.7は、ログの時刻がGMTで出力されるなど使い勝手がよくない。 で、いろいろ調べてみてみると、もう0.10.0が準備されている模様。 参考になるページ http //www.jajakarta.org/kvasir/bbs/technical/1295?msg=2#msg4759 CppUnit cocuppa,coumaについて
https://w.atwiki.jp/suffix/pages/554.html
SIFT特徴量の実装について分かりやすく説明しているサイトを教えてもらったので メモ。用語の意味については、SIFTとSURFを参照のこと。 SIFT実装について http //d.hatena.ne.jp/colorcle/20090629/1246292723 http //d.hatena.ne.jp/aidiary/20091024/1256384360 参照:SIFT実装そのままコピペしたらエラーが出た件 SURF実装について: http //www.happymeme.com/?p=84 http //www.sabamiso.net/yoggy/tdiary/?date=20090323#p01 http //d.hatena.ne.jp/Schima/20081211 ちなみにSURFはopencv1.1以降に関数が用意されている。 opencvのサンプルにfind_obj.cppがあるのでこれを参考にしよう。 これは長くて理解するのも大変だったので、結論だけかいつまんで説明すると、 CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i+1] ); のr- pt.xとr- pt.yにSURF特徴量の対応関係が取れた座標が格納されている。
https://w.atwiki.jp/yosilove/pages/21.html
複数の音源を鳴らす-CPP ALUT CPP Mac OpenAL ソースコード 解説 最終更新日 2009-09-25 View - link_pdfプラグインはご利用いただけなくなりました。 ダウンロード View - OpenALで複数の音源がランダムな位置で鳴るサンプル。 ALUTが必要です。 ドップラー効果(Doppler Effect)-CPP main.cpp keyboard.cpp keyboad.h MakefileMac 実行方法 実行結果 メモ テスト環境 Tanks main.cpp #include stdlib.h #include math.h #include OpenAL/al.h #include OpenAL/alc.h #include AL/alut.h #include "keyboard.h" // Maximum data buffers we will need. #define NUM_BUFFERS 3 // Maximum emissions we will need. #define NUM_SOURCES 3 // These index the buffers and sources. #define BATTLE 0 #define GUN1 1 #define GUN2 2 // Buffers hold sound data. ALuint Buffers[NUM_BUFFERS]; // Sources are points of emitting sound. ALuint Sources[NUM_SOURCES]; // Position of the source sounds. ALfloat SourcesPos[NUM_SOURCES][3]; // Velocity of the source sounds. ALfloat SourcesVel[NUM_SOURCES][3]; // Position of the listener. ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 }; // Velocity of the listener. ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 }; // Orientation of the listener. (first 3 elements are "at", second 3 are "up") ALfloat ListenerOri[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 }; /* * ALboolean LoadALData() * *This function will load our sample data from the disk using the alut *utility and send the data into OpenAL as a buffer. A source is then *also created to play that buffer. */ ALboolean LoadALData() { // Variables to load into. ALenum format; ALsizei size; ALvoid* data; ALsizei freq; ALboolean loop; // Load wav data into buffers. alGenBuffers(NUM_BUFFERS, Buffers); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //wavファイルの読み込み(バッファの用意) alutLoadWAVFile((ALbyte*)"wavdata/Battle.wav", format, data, size, freq); alBufferData(Buffers[BATTLE], format, data, size, freq); alutUnloadWAV(format, data, size, freq); alutLoadWAVFile((ALbyte*)"wavdata/Gun1.wav", format, data, size, freq); alBufferData(Buffers[GUN1], format, data, size, freq); alutUnloadWAV(format, data, size, freq); alutLoadWAVFile((ALbyte*)"wavdata/Gun2.wav", format, data, size, freq); alBufferData(Buffers[GUN2], format, data, size, freq); alutUnloadWAV(format, data, size, freq); // Bind buffers into audio sources. alGenSources(NUM_SOURCES, Sources); if(alGetError() != AL_NO_ERROR) return AL_FALSE; //音源の設定 alSourcei (Sources[BATTLE], AL_BUFFER, Buffers[BATTLE] ); alSourcef (Sources[BATTLE], AL_PITCH, 1.0f ); alSourcef (Sources[BATTLE], AL_GAIN, 1.0f ); alSourcefv(Sources[BATTLE], AL_POSITION, SourcesPos[BATTLE]); alSourcefv(Sources[BATTLE], AL_VELOCITY, SourcesVel[BATTLE]); alSourcei (Sources[BATTLE], AL_LOOPING, AL_TRUE ); alSourcei (Sources[GUN1], AL_BUFFER, Buffers[GUN1] ); alSourcef (Sources[GUN1], AL_PITCH, 1.0f ); alSourcef (Sources[GUN1], AL_GAIN, 1.0f ); alSourcefv(Sources[GUN1], AL_POSITION, SourcesPos[GUN1]); alSourcefv(Sources[GUN1], AL_VELOCITY, SourcesVel[GUN1]); alSourcei (Sources[GUN1], AL_LOOPING, AL_FALSE ); alSourcei (Sources[GUN2], AL_BUFFER, Buffers[GUN2] ); alSourcef (Sources[GUN2], AL_PITCH, 1.0f ); alSourcef (Sources[GUN2], AL_GAIN, 1.0f ); alSourcefv(Sources[GUN2], AL_POSITION, SourcesPos[GUN2]); alSourcefv(Sources[GUN2], AL_VELOCITY, SourcesVel[GUN2]); alSourcei (Sources[GUN2], AL_LOOPING, AL_FALSE ); // Do another error check and return. if(alGetError() != AL_NO_ERROR) return AL_FALSE; return AL_TRUE; } /* * void SetListenerValues() * *We already defined certain values for the listener, but we need *to tell OpenAL to use that data. This function does just that. * 観測者の設定 */ void SetListenerValues() { alListenerfv(AL_POSITION, ListenerPos); alListenerfv(AL_VELOCITY, ListenerVel); alListenerfv(AL_ORIENTATION, ListenerOri); } /* * void KillALData() * *We have allocated memory for our buffers and sources which needs *to be returned to the system. This function frees that memory. * お掃除 */ void KillALData() { alDeleteBuffers(NUM_BUFFERS, Buffers); alDeleteSources(NUM_SOURCES, Sources); alutExit(); } int main(int argc, char *argv[]) { printf("MindCode s OpenAL Lesson 3 Multiple Sources \n\n"); printf("(Press any key to quit.) \n"); // Initialize OpenAL and clear the error bit. alutInit(NULL, 0); alGetError(); //音源の設定 if(LoadALData() == AL_FALSE) return 0; //観測者の設定 SetListenerValues(); // Setup an exit procedure. //終了時に呼び出す関数 atexit(KillALData); // Begin the battle sample to play. alSourcePlay(Sources[BATTLE]); // Go through all the sources and check that they are playing. // Skip the first source because it is looping anyway (will always be playing). ALint state; while(!kbhit()) { for(int i = 1; i NUM_SOURCES; i++) { alGetSourcei(Sources[i], AL_SOURCE_STATE, state); if(state != AL_PLAYING)//再生中でなければ { // Pick a random position around the listener to play the source. //ランダムな位置に移動 double theta = (double) (rand() % 360) * 3.14 / 180.0; SourcesPos[i][0] = -float(cos(theta)); SourcesPos[i][1] = -float(rand()%2); SourcesPos[i][2] = -float(sin(theta)); alSourcefv(Sources[i], AL_POSITION, SourcesPos[i]); //鳴らす alSourcePlay(Sources[i]); } } } return 0; } keyboard.cpp /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include "keyboard.h" void init_keyboard() { tcgetattr(0, initial_settings); new_settings = initial_settings; new_settings.c_lflag = ~ICANON; new_settings.c_lflag = ~ECHO; new_settings.c_lflag = ~ISIG; new_settings.c_cc[VMIN] = 1; new_settings.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, new_settings); } void close_keyboard() { tcsetattr(0, TCSANOW, initial_settings); } int kbhit() { char ch; int nread; if(peek_character != -1) return 1; new_settings.c_cc[VMIN]=0; tcsetattr(0, TCSANOW, new_settings); nread = read(0, ch,1); new_settings.c_cc[VMIN]=1; tcsetattr(0, TCSANOW, new_settings); if(nread == 1) { peek_character = ch; return 1; } return 0; } int readch() { char ch; if(peek_character != -1) { ch = peek_character; peek_character = -1; return ch; } read(0, ch,1); return ch; } keyboad.h /* This is the unix code for kbhit I found on google at http //www.linuxquestions.org/questions/archive/9/2002/10/4/34027 */ #include stdio.h #include termios.h #include term.h #include curses.h #include unistd.h static struct termios initial_settings, new_settings; static int peek_character = -1; void init_keyboard(); void close_keyboard(); int kbhit(); int readch(); Makefile Mac CC = g++ TARGET = lesson2 COMPILEFLAGS = -framework OpenAL -lalut $(TARGET) main.o keyboard.o $(CC) -o $(TARGET) main.o keyboard.o $(COMPILEFLAGS) main.o main.cpp $(CC) -c main.cpp -Wno-deprecated keyboard.o keyboard.h keyboard.cpp $(CC) -c keyboard.cpp -Wno-deprecated clean rm -f $(TARGET) main.o 実行方法 コンパイルして make 実行 ./lesson3 実行結果 Multi.mp3 メモ makeすると以下のようなメッセージが出たりするかもしれません。 main.cpp 66 warning ‘alutLoadWAVFile’ is deprecated (declared at /usr/local/include/AL/alut.h 110) これは「alutLoadWAVFile」は今後のバージョンアップで使えなくなるかもよというメッセージです。 ALUTがバージョンアップすると、この関数は別の関数で置き換える必要がでるかも知れないので注意! テスト環境 MacOSX 10.5.8 i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 OpenAL ALUT 1.1.0 Tanks OpenAL Lesson 3 Multiple Sources